#include "StdAfx.h"
#include "Wielomian.h"
#include <math.h>


Wielomian::Wielomian(void)
{
}

Wielomian::Wielomian(double a)
{
	Wspolczynniki.resize(1);
	Wspolczynniki[0] = a;
}

Wielomian::Wielomian(double a, double b)
{
	Wspolczynniki.resize(2);
	Wspolczynniki[0] = b;
	Wspolczynniki[1] = a;
}

Wielomian::~Wielomian(void)
{
}

int Wielomian::Stopien(void)
{
	return Wspolczynniki.size() - 1;
}

double Wielomian::getWspolczynnik(int ktory)
{
	if(ktory <= Stopien())
	{
		return Wspolczynniki[ktory];
	}
	else 
	{
		return 0;
	}
}
void Wielomian::setWspolczynnik(int ktory, double wartosc)
{
	if(ktory <= Stopien())
	{
		Wspolczynniki[ktory] = wartosc;
	}
	else 
	{
		Wspolczynniki.resize(ktory + 1, 0);
		Wspolczynniki[ktory] = wartosc;
	}
}

ostream & operator<<(ostream & ekran, Wielomian & w)
{
	bool jestZerem = true;

	ekran << "(";

	for(int i = w.Stopien(); i >= 0; i--)
	{
		if( w.getWspolczynnik(i) != 0.0 )
		{
			jestZerem = false;

			if( i > 0 )
			{
				if( w.getWspolczynnik(i) == 1.0 )
				{
					ekran << "x";
				}
				else if( w.getWspolczynnik(i) == -1.0 )
				{
					ekran << "-x";
				}
				else
				{
					ekran << w.getWspolczynnik(i) << "x";
				}

				if( i > 1 )
				{
					ekran << "^" << i;
				}

				if(w.getWspolczynnik(i-1) > 0.0)
				{
					ekran << "+";
				}
			}
			else
			{
				ekran << w.getWspolczynnik(i);
			}
		}
	}

	if( jestZerem )
	{
		ekran << "0";
	}

	ekran << ")";

	return ekran;
}

Wielomian operator/(Wielomian w, double dzielnik)
{
	Wielomian rezultat;
	double tmp;
	for(int i = 0; i <= w.Stopien(); i++)
	{
		tmp = w.getWspolczynnik(i) / dzielnik;
		rezultat.setWspolczynnik(i, tmp);
	}
	return rezultat;
}

Wielomian operator+(Wielomian a, Wielomian b)
{
	Wielomian rezultat;
	double tmp;
	for(int i = 0; i <= max(a.Stopien(), b.Stopien()); i++)
	{
		tmp = a.getWspolczynnik(i) + b.getWspolczynnik(i);
		rezultat.setWspolczynnik(i, tmp);
	}
	return rezultat;
}

Wielomian operator*(Wielomian a, Wielomian b)
{
	Wielomian rezultat;

	double tmp;
	for(int i = 0; i <= a.Stopien(); i++)
	{
		for(int j = 0; j <= b.Stopien(); j++)
		{
			tmp = a.getWspolczynnik(i) * b.getWspolczynnik(j);
			tmp += rezultat.getWspolczynnik(i + j);
			rezultat.setWspolczynnik(i + j, tmp);
		}
	}
	return rezultat;
}